import Cocoa
import PlaygroundSupport

PlaygroundPage.current.needsIndefiniteExecution = true

//var str = "Hello, playground"

/**
 Cocoa Operation不需要关心线程管理和数据同步的事情, 可以把精力放在自己需要执行的操作上. 相关的类有Operation和OperationQueue. 其中Operation是个抽象类, 使用他必须用它的子类. 可以实现它或者使用它定义好的子类: BlockOperation. 创建Operation子类的对象,把对象添加到OperationQueue队列里执行
*/

//使用Operation的两种方式
//1.直接用定义好的子类: BlockOpearion
//class ObjectForOpearion {
//    func operationTest() {
//        //这里使用weak避免循环引用
//        let operation = BlockOperation(block: { [weak self] in
//            self?.operationWorker()
//            return
//        })
//        //创建一个NSOperationQueue实例并添加operation
//        let queue = OperationQueue()
//        queue.addOperation(operation)
//        print("operationTest")
//        print("current is \(Thread.current)")  //在主线程中执行
//
//    }
//    @objc func operationWorker() {
//        sleep(1)
//        print("operationWorker")  //异步执行的操作
//        print("-----current is \(Thread.current)")  //在异步线程中执行
//    }
//}
//let obj = ObjectForOpearion()
//obj.operationTest()
//print("after invoke test")

/**
 NSOperationQueue:
 1. NSOperationQueue队列中可以加入多个Operation, 可以吧NSOperationQueue看做一个线程池, 可以往线程池中添加操作(Operation)到队列中.
 2. 底层使用GCD
 3. maxConcurrentOperationCount 可以设置最大并发数
 4. defaultMaxConcurrentOperationCount 根据当前系统条件动态确定的最大并发数
 5. 可以取消所有Operation, 但是当前正在执行的不会取消
 6. 所有Operation执行完毕后退出销毁
 */

//继承Operation
class ObjectForThread {
    func threadTest() {
        let operation = MyOperation()
        //Operation完成的回调
        operation.completionBlock = { () -> Void in
            print("operation.completionBlock")  //所有操作执行完毕后才会执行里面的代码
        }
        let queue = OperationQueue()
        queue.addOperation(operation)
        print("*********")
    }
}

//自定义一个Operation,继承于Operation
class MyOperation: Operation {
    override func main() {
        sleep(1)
        print("----myOperation----")
        print("current is \(Thread.current)")  //在异步线程中执行
    }
}
let obj2 = ObjectForThread()
obj2.threadTest()
print("after invoke test")




